package com.telcordia.cvas.login;

import static org.easymock.EasyMock.createStrictMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertTrue;

import org.junit.Test;

public class LoginServiceTest {
	private static final String PASSWORD = "password";
	private static final String ACCOUNT = "account";

	private void setPasswordMatchingTo(Account account, boolean status) {
		expect(account.passwordMatches(isA(String.class))).andReturn(status);
	}
	
	@Test
	public void loggingInFailsOnce() {
		Account account = createStrictMock(Account.class);
		AccountRepository repo = createStrictMock(AccountRepository.class);
		expect(repo.findAccountNamed(isA(String.class))).andReturn(account);
		setPasswordMatchingTo(account, false);
		
		replay(account);
		replay(repo);
		
		LoginService service = new LoginService(repo);
		
		service.validateLogin(ACCOUNT, PASSWORD);
		
		verify(repo, account);
	}
	@Test
	public void loggingInSuccessfully() {
		Account account = createStrictMock(Account.class);
		AccountRepository repo = createStrictMock(AccountRepository.class);
		expect(repo.findAccountNamed(isA(String.class))).andReturn(account);
		expect(account.passwordMatches(isA(String.class))).andReturn(true);
		account.setLoggedIn(true);
		
		replay(account);
		replay(repo);
		
		LoginService service = new LoginService(repo);
		
		assertTrue(service.validateLogin(ACCOUNT, PASSWORD));
		
		verify(repo, account);
	}
}
